package leetcode;

import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 给定一个非空整数数组，除了某个元素只出现一次以外，其余每个元素均出现了三次。找出那个只出现了一次的元素。
 * 说明：
 * 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗？
 * 示例 1:
 * 输入: [2,2,3,2]
 * 输出: 3
 * 示例 2:
 * 输入: [0,1,0,1,0,1,99]
 * 输出: 99
 */

public class problems_137 {

    public static void main(String[] arge) {
        System.out.println(new Solution().singleNumber(new int[]{0, 1, 0, 99, 1, 0, 1}));
    }

    /**
     * 思路
     * 数组的总和 = 重复元素 * 3 + 不重复元素
     * 使用set保存所有元素，然后将其结果 * 3，然后减去数组总和，然后除以2
     */
    static class Solution {
        public int singleNumber(int[] nums) {
            Set<Long> set = new HashSet<>();
            Long sumArr = 0L;
            for (Integer num : nums){
                sumArr+=num; // 取得数组总和
                set.add(Long.valueOf(num)); // 全部元素
            }
            // 所有元素的和
            Long sumSet = 0L;
            for (Long num : set){
                sumSet+=num; // 取得元素总和
            }
            return (int) ((sumSet * 3 - sumArr) / 2);
        }
    }
}
